Para mostrar un fichero por la pantalla debemos obtener primero el nombre del fichero en cuestión y luego hacer un bucle que vaya leyendo línea por línea hasta el final. Empecemos suponiendo que el nombre del fichero es siempre el mismo:
#include <iostream> #include <fstream> using namespace std; int main() { ifstream F; F.open("escrito.txt"); string linea; getline(F, linea); while (!F.eof()) { cout << linea << endl; getline(F, linea); } }
Para saber cuando llegamos al final utilizamos el método eof, que devuelve true cuando estamos al final. Para obtener una línea entera llamamos a getline, que lee toda una línea (excepto el caracter de final de línea). Para mostrarla simplemente hacemos cout << linea pero añadiendo el endl que se perdió en el getline.
El esquema usado, que utiliza dos getlines uno antes de entrar al bucle y uno antes de volver a subir, permite detectar correctamente el final de fichero y no mostrar una línea más de lo debido.
Ahora habría que obtener el nombre del fichero del usuario. Para hacerlo, en vez de utilizar cin, lo haremos de una manera diferente. Utilizaremos los argumentos del programa.
Los argumentos de un programa son todas las palabras que se ponen a continuación del nombre del programa cuando lo invocamos desde un terminal (o "Símbolo del sistema" o "Línea de comandos"). Si nuestro programa se llama muestra y estamos en un terminal, al hacer:
muestra a b c
Los argumentos del programa son a, b, y c. Estos argumentos son cadenas de caracteres, y cualquier programa de C o C++ los puede obtener a través de la función main.
Hasta ahora hemos puesto la cabecera de main sin parámetros, pero también se puede poner así:
int main(int argc, char *argv[]) { // ... }
En esta versión, main recibe 2 parámetros:
Nuestro programa mirará solamente si hay un primer argumento (el 1) y mostrará el fichero indicado en ese argumento:
#include <iostream> #include <fstream> using namespace std; int main(int argc, char *argv[]) { if (argc < 2) { return 1; } ifstream F; F.open(argv[1]); string linea; getline(F, linea); while (!F.eof()) { cout << linea << endl; getline(F, linea); } F.close(); return 0; }
Si el número de argumentos es menor que 2, seguro que el argumento 1 no existe, de forma que el programa retorna. El código que retorna informa al sistema operativo de que algo ha fallado. Si argc es 2 o más, el programa toma el nombre del fichero de argv[1] y procede con el bucle explicado anteriormente, retornando 0 al final, que significa que todo ha ido bien.
En preparación